package com.atguigu.juc.chap03;

/**
 * 隐式锁 解决虚假唤醒
 *
 * 现在两个线程，
 * 可以操作初始值为零的一个变量，
 * 实现一个线程对该变量加1，一个线程对该变量减1，
 * 交替，10轮。
 * <p>
 * 笔记：Java里面如何进行工程级别的多线程编写
 * 1 多线程编程模板（套路）
 * 1.1  线程    操作    资源类
 * 1.2  高内聚  低耦合
 * 2 多线程编程模板（套路）
 * 2.1  判断
 * 2.2  干活
 * 2.3  通知
 *
 * @author Taeyang
 * @date 2025/4/1
 */
public class NotifyWaitDemo02 {
    public static void main(String[] args) {
        ShareDataOne02 shareDataOne = new ShareDataOne02();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                shareDataOne.increment();
            }
        }, "AAA").start();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                shareDataOne.decrement();
            }
        }, "BBB").start();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                shareDataOne.increment();
            }
        }, "CCC").start();

        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                shareDataOne.decrement();
            }
        }, "DDD").start();
    }
}

class ShareDataOne02 {
    private Integer number = 0;

    /**
     * 增加1
     */
    public synchronized void increment() {
        try {
            // 1. 判断
            while (number != 0) {
                this.wait();
            }

            // 2. 干活
            number++;
            System.out.println(Thread.currentThread().getName() + ": " + number);

            // 3. 通知
            this.notifyAll();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 减少1
     */
    public synchronized void decrement() {
        try {
            // 1. 判断
            while (number != 1) {
                this.wait();
            }

            // 2. 干活
            number--;
            System.out.println(Thread.currentThread().getName() + ": " + number);

            // 3. 通知
            this.notifyAll();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
